import type { RouteRecordRaw } from 'vue-router'

// 加载本地路由
export function loadLocalRoutes() {
  // 动态添加路由
  const localRoutes: RouteRecordRaw[] = []

  // 读取 router/main 中所有的 ts 文件
  // Vite 支持使用特殊的 import.meta.glob 函数从文件系统导入多个模块
  // { eager: true }: 默认情况下是懒加载的,设置为 true 代表立即加载
  const files: Record<string, any> = import.meta.glob('../router/main/**/*.ts', {
    eager: true
  })

  for (const key in files) {
    const moudle = files[key]
    // 每次一个 route 对象 {path: '/main/analysis/dashboard', component: ƒ}
    // console.log(moudle.default)
    localRoutes.push(moudle.default)
  }

  return localRoutes
}

// 获取到第一个菜单,作为登录成功时,第一次进入的页面
export let firstMenu: any = null

// 映射菜单到动态路由
export function mapMenuToRoutes(userMenus: any[]) {
  const localRoutes = loadLocalRoutes()

  const routes: RouteRecordRaw[] = []

  for (const menu of userMenus) {
    // 二级路由
    for (const subMenu of menu.children) {
      const route = localRoutes.find((item) => item.path === subMenu.url)
      if (route) {
        // 给 route 的顶层菜单增加一个重定向(只需要添加到第一个子元素即可)
        if (!routes.find((item) => item.path === menu.url)) {
          routes.push({ path: menu.url, redirect: route.path })
        }

        // 二级菜单
        routes.push(route)
      }

      // 记录第一个被匹配到的菜单
      if (!firstMenu && route) {
        firstMenu = subMenu
      }
    }
  }

  return routes
}

/**
 * 根据路径匹配要显示的菜单
 * @param path 需要匹配的路径
 * @param userMenus 所有的菜单
 */
export function mapPathToMenu(path: string, userMenus: any[]) {
  for (const menu of userMenus) {
    for (const subMenu of menu.children) {
      if (subMenu.url === path) {
        return subMenu
      }
    }
  }
}

interface IBreadcrumbs {
  name: string
  path: string
}

// 根据路径生成面包屑
export function mapPathToBreadcrumb(path: string, userMenus: any[]) {
  const breadcrumb: IBreadcrumbs[] = []

  for (const menu of userMenus) {
    for (const subMenu of menu.children) {
      if (subMenu.url === path) {
        // 顶层菜单
        breadcrumb.push({ name: menu.name, path: menu.url })
        // 匹配菜单
        breadcrumb.push({ name: subMenu.name, path: subMenu.url })
      }
    }
  }
  return breadcrumb
}

// 将当前菜单及其子菜单的 id 提取到数组中
export function mapMenuListToIds(menuList: any[]) {
  const ids: number[] = []

  function recurseGetId(menuList: any) {
    for (const item of menuList) {
      if (item.children) {
        recurseGetId(item.children)
      } else {
        ids.push(item.id)
      }
    }
  }

  recurseGetId(menuList)

  return ids
}

// 从菜单列表中提取权限数组
export function mapMenusToPermissions(menuList: any[]) {
  const permissions: string[] = []

  function recurseGetPermission(menus: any[]) {
    for (const item of menus) {
      if (item.type === 3) {
        permissions.push(item.permission)
      } else {
        recurseGetPermission(item.children ?? [])
      }
    }
  }

  recurseGetPermission(menuList)

  return permissions
}
